Я уже писал, что HRESULT довольно сложная переменная и определить ошибку по ней довольно сложно. Давайте посмотрим как это исправить. В шаге "Шаг 44 - Обработка ошибок COM - HRESULT" было написано про Error Lookup. Вот теперь все вместе и сделаем. Напишем программу:
#include "stdafx.h"
#include "windows.h"
#include "ole2.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
OLECHAR filename[20];
wcscpy(filename,L"test.stg");
LPSTORAGE pIStorage=NULL;
HRESULT rez;
rez=StgOpenStorage(filename,NULL, STGM_READ ,NULL,0,&pIStorage);
if (!FAILED(rez))
{
cout << "Ok open" << endl;
}
else cout << "Error open" << endl;
return 0;
}
Запустим и посмотрим, что будет:
Error open Press any key to continue
Ошибка !!! Установим курсор на строку с Failed и запустим программу на выполнение до курсора.

Внизу у нас будут значения текущих переменных.

Обратите внимание на то, что у меня стоит просмотр как Hex. Это необходимо, чтобы скопировтать значение переменной rez. Если на ней два раза щелкнуть, то появится возможность ее скопировать через меню Edit Copy:

Вот теперь запустим Error Lookup. Значение переменной уже должно быть в окне. Если нет, то вставьте. Нажав на кнопку Look Up мы увидим ошибку.

И правда мы при открытии хранилища не указали флаги. Как его открывать, то есть с каким доступом, а это необходимо.